<?php
/**
 * 医帮网公共函数库
 * @category Tech
 * @package  Action
 * @author   tongjh
 * @version  V1.0
 * +----------------------------------------------------------------------
 */


/**
* 得到随机字符
* @params int $n 得到多少位的字符
* @return string  
*/
function get_rand( $n=8 ) { 
    return substr(str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, $n); 
} 

/**
 * 取得随机颜色
 * @access public
 * @return void
 */
function rcolor() {
	$rand = rand(0,255);//随机获取0--255的数字
	return sprintf("%02X","$rand");//输出十六进制的两个大写字母   
}   
 
function rand_color(){
	return '#'.rcolor().rcolor().rcolor();//六个字母
}


/**
 * 返回一个查询数据库的二维数组数据
 * @ tablename string 表名
 * @ where string||array where条件
 * @ limit string limit 
 * @ order string order 排序
 * @return void
 */
function get_array($table,$where=1,$limit='',$order=''){
	$Model = M($table);
	$list = $Model->where($where)->limit($limit)->order($order)->select();
	return $list;
}

/**
 * 根据条件取得某个表的某个字段
 * @access public
 * @param     string  $table  需要取得的字段的表名
 * @param     int  $where  这里使用array('id'='使用主键唯一字段进行查询')
 * @param     string  $field  需要返回的字段名
 * @return string 根据ID查询出字段值
 */
function get_field($table,$where,$field){
	$Form = M($table);
	$list = $Form->where($where)->find();
	return $list[$field];
}

/**
 * 根据条件取得某个表的一行数组
 * @access public
 * @param     string  $table  需要取得的字段的表名
 * @param     int  $where  这里使用array('id'='使用主键唯一字段进行查询')
 * @return string 根据ID查询出字段值
 */
function get_fields($table,$where){
    $Form = M($table);
    $list = $Form->where($where)->find();
    return $list;
}


/**
 * 在模板中根据用户ID取得某个字段
 * @access public
 * @param     string  $table  需要取得的字段的表名
 * @param     int  $获得  获得字段的ID值
 * @param     int  $id  获得的字段名
 * @return string
 */
function get_id_field($tablename,$id,$field){
	$Model = M($tablename);
	$list = $Model->getFieldByid($id,$field);
	return $list;
}



/**
 * 在模板中根据某字段值取得某个字段
 * @access public
 * @param     string  $table  需要取得的字段的表名
 * @param     string  $key 字段名
 * @param     string  $value  字段值
 * @param     string  $name  要返回的字段名
 * @return string 
 */
function get_name_field($table,$key,$value,$name){
    $Model = M($table);
    $map[$key] = $value;
    $list = $Model->where($map)->find();
    return $list[$name];
}


/**
 * 向表中插入一条数据
 * @access public
 * @param     string  $table  表名
 * @param     int  $date  插入的数组
 * @param     array  $type  插入配置 （ceshi:默认0不输入SQL语句，1输入SQL语句）（type:默认0使用M()方法实例模型，1为使用D()方法）(validate:动态改变验证规则)
 * @return string 0或1 成功或失败
 */
function _insert($table,$date=array(),$type=array('ceshi'=>0,'type'=>0,'validate'=>array())){
    if($type['type']){//实例化模型
        $Form = D($table);
    }else{
        $Form = M($table);
    };
    $vo = $Form->create($date);//创建数据
    if(false == $vo){return $Form->getError();}//验证失败返回错误
    $id = $Form->add();//插入数据
    if($type['ceshi'] == 1){
        return $Form->_sql();
    }
    if(false !== $id){
        return $id;//添加成功返回插入的ID
    }
    return 0;
}

/**
 * 查询数据
 * @access public
 * @param     string  $table  表名
 * @param     int  $where  查询条件
 * @param     array  $type  配置 （ceshi:默认0不输入SQL语句，1输入SQL语句）（type:默认0使用M()方法实例模型，1为使用D()方法）(validate:动态改变验证规则)
 * @return string 0或1 成功或失败
 */
function _select($table,$where=array(),$type=array(),$limit=''){
    //实例化模型    
    $Form = M($table);
    $array = $Form->where($where)->limit($limit)->select();
    if($type['ceshi'] == 1){//测试输出SQL语句
        echo $Form->_sql();exit;
    }
    if(false !== $array){
        return $array;//查询成功返回数据
    }
    return "查询数据失败";
}


/**
 * 更新数据
 * @access public
 * @param     string  $table  表名
 * @param     int  $date  更新数据
 * @param     int  $where  更新条件
 * @param     array  $type  配置 （ceshi:默认0不输入SQL语句，1输入SQL语句）（type:默认0使用M()方法实例模型，1为使用D()方法）(validate:动态改变验证规则)
 * @return string 0或1 成功或失败
 */
function _update($table,$date=array(),$where=array(),$type=array('ceshi'=>0,'type'=>0,'validate'=>array())){
    //实例化模型    
    $Form = M($table);
    $array = $Form->where($where)->save($date);
    if($type['ceshi'] == 1){//测试输出SQL语句
        return $Form->_sql();
    }
    if(false !== $array){
        return $array;//查询成功返回数据
    }
    return "更新数据失败";
}



/**
 * 根据用户ID得到站内信发送人
 * @access public
 * @param     string  $table  表名
 * @param     int  $type  1患者发送 2医生发送 3系统发送 
 * @param     int  $id    发送人ID
 * @return string 发送人姓名
 */
function fasongren($type,$id){
    switch ($type) {
        case 1:
            return get_id_field('huanzhe',$id,'name');
            break;
        case 2:
            return get_id_field('yishenguser',$id,'name');
            break;
        default:
            return "系统";
            break;
    }
}



/**
 * 根据问题ID得到此条问题共有多少个回答
 * @access public
 * @param     int  $id  问题ID
 * @return int  此条问题共有多少个回答
 */
function get_wenti_num($id){
    $Form = M('huifu');
    $num = $Form->where('wentiid='.$id)->count();
    return $num;
}

/**
 *+----------------------------------------------------------
 * 循环创建目录
 *+----------------------------------------------------------
 * @access public
 *+----------------------------------------------------------
 * @return void
 *+----------------------------------------------------------
 */
function createFolder($path)
{
  if (!file_exists($path))
  {
   createFolder(dirname($path));
   mkdir($path, 0777);
  }
}

/*
* 过滤HTML标签
*
*/
function Html2text($str){
    $content = preg_replace("/(<[^>]+>)/is",'',$str);
    return $content;
}


/*
* 递归科室
* @params array $keshi 数组
* @params int $id topid
* @return array $array 返回多维数组
*/
function dg_keshi($keshi,$id=0){
    static $a = array();
    $result = findChild($keshi,$id);//取得当前节点下的所有同级子节点

    foreach ($result as $k => $v) {
        $result2 = dg_keshi($keshi,$v['id']);
        if( null !=   $result2){
            $result[$k]['childs']=$result2;
        }

        //dg_keshi($keshi,$v['id']);
    }
    return $result;
}

/*
* 递归无限分类树
* @param string $tag 缩进填充字符
* @param int $id 当前节点的父ID
*/
function display_tree($tag,$id) {
    static $a = array();
    $array = C('digui');//查询出来的数组，这里申明成常量，为了可以调用外界的$array
    $result = findChild($array,$id);//取得当前节点下的所有同级子节点
    foreach ($result as $k => $v){
        // 缩进显示节点名称 
        $a[$v['id']] = $tag.$v['name'];
        //再次调用这个函数显示子节点下的同级子节点 
        display_tree($tag."|_____",$v['id']);   
   }
   return $a;
}
//取得当前节点下的所有同级子节点
function findChild(&$arr,$id){
    $childs=array();
     foreach ($arr as $k => $v){
         if($v['topid']== $id){
              $childs[]=$v;
         }
    }
    return $childs;
}

/*
* 根据医生会员表ID 取得医生所在科室的信息
* @param int  $yishenguserid
*/
function get_keshi($yishenguserid,$name){
    $yishengid = get_name_field('yishenguser','id',$yishenguserid,'yishengid');
    $keshiid = get_name_field('yisheng','id',$yishengid,'keshiid');
    $keshi = get_name_field('keshi','id',$keshiid,$name);
    return $keshi;
}

/*
* 递归数据,递归成多维数组，childs存储下级，生产环境中请把返回值进行缓存，这样只查库一次，可以在新增和更新的方法处再调用这个函数更新缓存
* @param string $table 查询的表名
* @param array $where 查询的where条件
* @param array $other 其它查询需要的变量
* @return array $list 一个表示层级关系的多维数组
*/
function digui($table,$where,$other){
    $Form = M($table);
    if($other['join']){
        $list = $Form->field($other['field'])->join($other['join'])->where($where)->order($other['order'])->select();
    }else{
        $list = $Form->field($other['field'])->where($where)->order($other['order'])->select();
    }
    foreach ($list as $k => $v) {
        if($digui = digui($table,array('topid'=>$v['id']),$other)){
            $list[$k]['childs'] = $digui;//递归子类
        }        
    }
    return $list;
}

/*
* 读取递归数据的函数，使用前请把digui()函数的返回值进行缓存
* @param array $list 这个参数是S('keshi')读取过来的层级关系的多维数组，是由digui()产生的
* @return void 无返回值直接输出
*/
function KeshiType($list){
    foreach ($list as $k => $v) {
         echo '<tr align="center"  bgcolor="#FBFCE2" height="22" class="fid"><td width="7%"><span class="jia"></span>'.$v['id'].'</td><td width="14%"><a href="__GROUP__/Yiyuan/index">'.$v['yiyuan'].'</a></td><td width="14%">'.$v['name'].'</td><td><span class="coolbg" onClick="winopen(\'__URL__/keshi_edit/yiyuanid/'.$v['yiyuanid'].'/id/'.$v['id'].'\',\'id'.$v['id'].'\',1000,650)">科室编辑</span>&nbsp;&nbsp;<span alt="'.$v['id'].'" title="'.$v['name'].'" class="ksjb">科室疾病</span>&nbsp;&nbsp;<a href="__GROUP__/Yisheng/index/yiyuanid/'.$v['yiyuanid'].'/keshiid/'.$v['id'].'" class="coolbg">医生管理</a>&nbsp;&nbsp;<a href="__URL__/keshi_del/yiyuanid/'.$v['yiyuanid'].'/id/'.$v['id'].'" class="coolbg" onClick="return confirm(\'你确定要删除该记录吗？\');">科室删除</a></td></tr>';
         KeshiTypeSeed($v['childs']);
     } 
}
/*
* 楼上KeshiType的子函数配合递归
*/    
function KeshiTypeSeed($list){
    if($list){
        echo '<tr align="center"  bgcolor="#FFFFFF" height="22" class="seed"><td colspan="4"><table width="98%">';
        foreach ($list as $k => $v) {
             echo '<tr align="center"  bgcolor="#FBFCE2" height="22" class="fid"><td width="7%"><span class="jia"></span>'.$v['id'].'</td><td width="14%"><a href="__GROUP__/Yiyuan/index">'.$v['yiyuan'].'</a></td><td width="14%">'.$v['name'].'</td><td><span class="coolbg" onClick="winopen(\'__URL__/keshi_edit/yiyuanid/'.$v['yiyuanid'].'/id/'.$v['id'].'\',\'id'.$v['id'].'\',1000,650)">科室编辑</span>&nbsp;&nbsp;<span alt="'.$v['id'].'" title="'.$v['name'].'" class="ksjb">科室疾病</span>&nbsp;&nbsp;<a href="__GROUP__/Yisheng/index/yiyuanid/'.$v['yiyuanid'].'/keshiid/'.$v['id'].'" class="coolbg">医生管理</a>&nbsp;&nbsp;<a href="__URL__/keshi_del/yiyuanid/'.$v['yiyuanid'].'/id/'.$v['id'].'" class="coolbg" onClick="return confirm(\'你确定要删除该记录吗？\');">科室删除</a></td></tr>';
             KeshiTypeSeed($v['childs']);
         }
        echo '</table></td></tr>';
    }
}

/*
* 递归左侧菜单数据,递归成多维数组
* @param string $table 查询的表名
* @param array $where 查询的where条件
* @param array $other 其它查询需要的变量
* @return array $list 一个表示层级关系的多维数组
*/
function MenuDigui($table,$where,$other){
    $Form = M($table);
    if($other['join']){
        $list = $Form->field($other['field'])->join($other['join'])->where($where)->order($other['order'])->select();
    }else{
        $list = $Form->field($other['field'])->where($where)->order($other['order'])->select();
    }
    foreach ($list as $k => $v) {
        if($digui = MenuDigui($table,array('topid'=>$v['menuid']),$other)){
            $list[$k]['childs'] = $digui;//递归子类
        }        
    }
    return $list;
}

/*
* 左侧菜单递归
* @param array $list 这个参数是S('keshi')读取过来的层级关系的多维数组，是由MenuDigui()产生的
* @return void 无返回值直接输出
*/
function MenuTree($list){
    foreach ($list as $k => $vo) {
         echo '<tr align="center" bgcolor="#FFFFFF" onMouseMove="javascript:this.bgColor=\'#FCFDEE\';" onMouseOut="javascript:this.bgColor=\'#FFFFFF\';" height="22"  class="fid"><td><span class="jia"></span>'.$vo['menuid'].'</td><td><a href="__URL__/yiyuan_edit/id/<{$vo.id}>"><u>'.$vo['menuname'].'</u></a></td><td><a href=""><u>'.$vo['rul'].'</u></a></td>        <td><a href=""><u>'.$vo['groupname'].'</u></a></td><td><span class="coolbg" onClick="winopen(\'__URL__/menu_edit/id/'.$vo['menuid'].'\',\'edit\',1000,650)">编辑</span>&nbsp;&nbsp;<a href="__URL__/menu_del/id/'.$vo['menuid'].'" class="coolbg" onClick="return confirm(\'你确定要删除该记录吗？\');">删除</a></td></tr>';
         MenuTreeSeed($vo['childs']);
     } 
}

/*
* 左侧菜单递归的子函数配合递归
*/    
function MenuTreeSeed($list){
    if($list){
        echo '<tr align="center"  bgcolor="#FFFFFF" height="22" class="seed"><td colspan="5"><table width="98%">';
        foreach ($list as $k => $vo) {
             echo '<tr align="center"  bgcolor="#FBFCE2" height="22" class="fid"><td width="7%"><span class="jia"></span>'.$vo['menuid'].'</td><td width="14%"><a href="__GROUP__/Yiyuan/index">'.$vo['menuname'].'</a></td><td width="14%">'.$vo['url'].'</td><td width="14%">'.$vo['groupname'].'</td><td><span class="coolbg" onClick="winopen(\'__URL__/menu_edit/id/'.$vo['menuid'].'\',\'edit\',1000,650)">编辑</span>&nbsp;&nbsp;<a href="__URL__/menu_del/id/'.$vo['menuid'].'" class="coolbg" onClick="return confirm(\'你确定要删除该记录吗？\');">删除</a></td></tr>';
             MenuTreeSeed($vo['childs']);
         }
        echo '</table></td></tr>';
    }
}





/*
* 节点递归输出
* @param array $list 这个参数是S('keshi')读取过来的层级关系的多维数组，是由digui()产生的
* @return void 无返回值直接输出
*/
function JiedianTree($list){
    foreach ($list as $k => $v) {
         echo '<tr align="center"  bgcolor="#FBFCE2" height="22" class="fid"><td width="7%"><span class="jia"></span>'.$v['id'].'</td><td width="14%"><a href="__GROUP__/Yiyuan/index">'.$v['name'].'</a></td><td width="30%">'.$v['action'].'</td><td><span class="coolbg" onClick="winopen(\'__URL__/jiedian_edit/id/'.$v['id'].'\',\'id'.$v['id'].'\',1000,650)">编辑</span>&nbsp;&nbsp;<a href="__URL__/jiedian_del/id/'.$v['id'].'" class="coolbg" onClick="return confirm(\'你确定要删除该记录吗？\');">删除</a></td></tr>';
         JiedianTreeSeed($v['childs']);
     } 
}
/*
* 节点递归输出的子函数配合递归
*/    
function JiedianTreeSeed($list){
    if($list){
        echo '<tr align="center"  bgcolor="#FFFFFF" height="22" class="seed"><td colspan="4"><table width="98%">';
        foreach ($list as $k => $v) {
             echo '<tr align="center"  bgcolor="#FBFCE2" height="22" class="fid"><td width="7%"><span class="jia"></span>'.$v['id'].'</td><td width="14%"><a href="__GROUP__/Yiyuan/index">'.$v['name'].'</a></td><td width="30%">'.$v['action'].'</td><td><span class="coolbg" onClick="winopen(\'__URL__/jiedian_edit/id/'.$v['id'].'\',\'id'.$v['id'].'\',1000,650)">编辑</span>&nbsp;&nbsp;<a href="__URL__/jiedian_del/id/'.$v['id'].'" class="coolbg" onClick="return confirm(\'你确定要删除该记录吗？\');">删除</a></td></tr>';
             JiedianTreeSeed($v['childs']);
         }
        echo '</table></td></tr>';
    }
}



/*
* 用户组节点递归输出
* @param array $list 这个参数是S('keshi')读取过来的层级关系的多维数组，是由digui()产生的
* @return void 无返回值直接输出
*/
function JiedianGroupTree($list){
    foreach ($list as $k => $v) {
         echo '<tr align="center"  bgcolor="#FBFCE2" height="22" class="fid"><td width="10%"><span class="jia"></span>'.$v['id'].'</td><td width="25%"><a href="__GROUP__/Yiyuan/index">'.$v['name'].'</a></td><td width="45%">'.$v['action'].'</td><td><label><input type="checkbox" name="sys[]" value="'.$v['id'].'" id="'.$v['id'].'" class="sys" /></label></td></tr>';
         JiedianGroupTreeSeed($v['childs']);
     } 
}
/*
* 用户组节点递归输出的子函数配合递归
*/    
function JiedianGroupTreeSeed($list){
    if($list){
        echo '<tr align="center"  bgcolor="#FFFFFF" height="22" class="seed"><td colspan="4"><table width="98%">';
        foreach ($list as $k => $v) {
             echo '<tr align="center"  bgcolor="#FBFCE2" height="22" class="fid"><td width="10%"><span class="jia"></span>'.$v['id'].'</td><td width="25%"><a href="__GROUP__/Yiyuan/index">'.$v['name'].'</a></td><td width="45%">'.$v['action'].'</td><td><label><input type="checkbox" name="sys[]" value="'.$v['id'].'" id="'.$v['id'].'" class="sys" /></label></td></tr>';
             JiedianGroupTreeSeed($v['childs']);
         }
        echo '</table></td></tr>';
    }
}

/**
 * 验证输入的邮件地址是否合法
 *
 * @access  public
 * @param   string      $user_email      需要验证的邮件地址
 *
 * @return bool
 */
function is_email($user_email)
{
    $chars = "/^([a-z0-9+_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,6}\$/i";
    if (strpos($user_email, '@') !== false && strpos($user_email, '.') !== false)
    {
        if (preg_match($chars, $user_email))
        {
            return true;
        }else{
            return false;
        }
    }else{
        return false;
    }
}



/*
 * 判断是否为整数
 */
function is_zhengshu($str){
    if(!is_numeric($str)||strpos($str,".")!==false){
        return false;
    }
    return true;    
}

/*
 * 删除目录及下面的所有文件
 */
function deldir($dir) {
  //先删除目录下的文件：
  $dh=opendir($dir);
  while ($file=readdir($dh)) {
    if($file!="." && $file!="..") {
      $fullpath=$dir."/".$file;
      if(!is_dir($fullpath)) {
          unlink($fullpath);
      } else {
          deldir($fullpath);
      }
    }
  }
  closedir($dh);
  //删除当前文件夹：
  if(rmdir($dir)) {
    return true;
  } else {
    return false;
  }
}